package com.example.demo.service;

import com.example.demo.exception.IMIDHadCreatedException;
import com.example.demo.exception.IMIDNotExistException;

import java.io.IOException;

public interface IMService {

    /**
     * IMService 提供 在线通信服务的抽象
     *
     * 关键概念：
     * 1. originId 是 app自己的数据库中为不同用户角色设置的 id，该 id 必须是唯一的。
     * 2. accId / ImId 是 app用户在IM系统中的 id，该id也是唯一的。
     * 3. token / userSign 是app用户登录，使用IM服务的凭证。
     */

    /**
     * 返回用户是否在IM系统中创建了Id
     * @param originId 用户在app系统中的唯一id
     * @return boolean
     */
    public Boolean isOriginIdUsed(String originId) throws IOException;

    /**
     * 调用该方法前，请先调用 isOriginIdUsed 方法确认 IMId 的生成情况。
     * 传入 originId，若该id已创建过ImId，抛出IMIDHadCreatedException,
     * 若该id已经创建过ImId，成功创建ImId，并返回。
     * @param originId 用户在app系统中的唯一id
     * @return ImId 用户在IM系统的唯一id
     */
    public String generateIMId(String originId) throws IMIDHadCreatedException, IOException;

    /**
     * 调用该方法前，请先调用 isOriginIdUsed 方法确认 IMId 的生成情况。
     * 传入 originId，若该id未创建过ImId，抛出IMIDNotExistException,
     * 若该id已经创建过ImId，并返回ImId。
     * @param originId 用户在app系统中的唯一id
     * @return ImId 用户在IM系统的唯一id
     */
    public String queryIMId(String originId) throws IMIDNotExistException, IOException;

    /**
     * 调用getIMToken, 若该 originId 未在IM系统中生成对应的 IMID，抛出IMIDNotExistException。
     * 存在IMID，生成登录IM服务的凭证。( token / sign )
     * @param originId 用户在app系统中的唯一id
     * @return token 调用IM服务的凭证
     * @throws IMIDNotExistException
     */
    public String getIMToken(String originId) throws IMIDNotExistException;
}
